package br.com.dlm.simuladoitil.controle;

import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import br.com.dlm.simuladoitil.basicas.Alternativa;
import br.com.dlm.simuladoitil.basicas.Categoria;
import br.com.dlm.simuladoitil.basicas.Questao;
import br.com.dlm.simuladoitil.util.ArquivoJSON;

public class RepositorioNuvem {

    private InputStream lerArquivo() {
        final String URL_ARQUIVO_JSON = "http://simulado-itil.googlecode.com/svn/trunk/Base.json";
        final String METODO_REQUEST = "GET";
        final int TIMEOUT_LEITURA = 10 * 1000;
        final int TIMEOUT_CONEXAO = 15 * 1000;
        final boolean DO_INPUT = true;

        try {
            HttpURLConnection conexao = (HttpURLConnection) new URL(URL_ARQUIVO_JSON).openConnection();
            conexao.setReadTimeout(TIMEOUT_LEITURA);
            conexao.setConnectTimeout(TIMEOUT_CONEXAO);
            conexao.setDoInput(DO_INPUT);
            conexao.setRequestMethod(METODO_REQUEST);

            conexao.connect();

            if (conexao.getResponseCode() == HttpURLConnection.HTTP_OK){
                return conexao.getInputStream();
            }
        } catch (MalformedURLException  excecao) {
            Log.e("FALHA_LEITURA_DO_ARQUIVO_JSON", excecao.getMessage());
        } catch (IOException excecao) {
            Log.e("FALHA_LEITURA_DO_ARQUIVO_JSON", excecao.getMessage());
        }
        return null;
    }

    private String inputStreamToString(InputStream inputStream) throws IOException {
        byte[] buffer = new byte[1024];
        int bytesLidos;
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        while ((bytesLidos = inputStream.read(buffer)) > -1){
            byteArrayOutputStream.write(buffer, 0, bytesLidos);
        }
        return new String(byteArrayOutputStream.toByteArray());
    }

    public ArquivoJSON obterArquivoJSON() {
        ArquivoJSON arquivoJSON = new ArquivoJSON();
        try {
            JSONObject jsonObjectRaiz = new JSONObject(inputStreamToString(lerArquivo()));

            arquivoJSON.vesrao = jsonObjectRaiz.getDouble("versao");
            arquivoJSON.categorias = new ArrayList<Categoria>();

            JSONArray jsonArrayCategorias = jsonObjectRaiz.getJSONArray("categorias");
            for (int indexCategoria = 0; indexCategoria < jsonArrayCategorias.length(); indexCategoria++) {
                JSONObject jsonObjectCategoria = jsonArrayCategorias.getJSONObject(indexCategoria);

                Categoria categoria = new Categoria(
                        jsonObjectCategoria.getString("id"),
                        jsonObjectCategoria.getString("nome"),
                        jsonObjectCategoria.getString("descricao"),
                        new ArrayList<Questao>());

                arquivoJSON.categorias.add(categoria);

                JSONArray jsonArrayQuestoes = jsonObjectCategoria.getJSONArray("questoes");

                if (jsonArrayQuestoes.length() > 0) {
                    for (int indexQuestao = 0; indexQuestao < jsonArrayQuestoes.length(); indexQuestao++) {
                        JSONObject jsonObjectQuestao = jsonArrayQuestoes.getJSONObject(indexQuestao);

                        Questao questao = new Questao(
                                jsonObjectQuestao.getString("id"),
                                jsonObjectQuestao.getString("pergunta"),
                                new ArrayList<Alternativa>(),
                                jsonObjectQuestao.getString("idAlternativaCorreta")
                        );

                        categoria.questoes.add(questao);

                        JSONArray jsonArrayAlternativas = jsonObjectQuestao.getJSONArray("alternativas");

                        if (jsonArrayAlternativas.length() > 0) {
                            for (int indexAlternativa = 0; indexAlternativa < jsonArrayAlternativas.length(); indexAlternativa++) {
                                JSONObject jsonObjectAlternativa = jsonArrayAlternativas.getJSONObject(indexAlternativa);

                                Alternativa alternativa = new Alternativa(
                                        jsonObjectAlternativa.getString("id"),
                                        jsonObjectAlternativa.getString("texto")
                                );

                                questao.alternativas.add(alternativa);
                            }
                        }
                    }
                }
            }
        } catch (IOException excecao) {
            Log.e("FALHA_OBTER_ARQUIVO_JSON", excecao.getMessage());
        } catch (JSONException excecao) {
            Log.e("FALHA_OBTER_ARQUIVO_JSON", excecao.getMessage());
        }
        return arquivoJSON;
    }
}
